//
// 内存池管理
// Created by kenny on 25-11-10.
//

#ifndef MCP_MESSAGE_QUEUE_H
#define MCP_MESSAGE_QUEUE_H

#include <stdlib.h>
#include <string.h>
#include "../bm/sys_inc.h"

#define MAX_MEM_NUM  30*10
#define MAX_MSG_LEN  2*1024

// 内存块结构体
typedef struct memory_block {
    unsigned char* p_buff;        // 缓冲区指针
    unsigned int buff_size;       // 缓冲区大小
    unsigned int buff_real_size;   // 实际使用大小
} memory_block;

// 消息队列结构体
typedef struct msg_queue {
    memory_block** used_queue;     // 已使用队列
    memory_block** unused_queue;   // 未使用队列
    int used_size;               // 已使用队列大小
    int unused_size;             // 未使用队列大小
    int used_capacity;           // 已使用队列容量
    int unused_capacity;         // 未使用队列容量
    unsigned long total_blocks;  // 总块数
    void* used_mutex;           // 已使用队列互斥锁
    void* unused_mutex;         // 未使用队列互斥锁
} msg_queue;

// 函数声明

// memory_block 相关函数
memory_block* mb_create(unsigned int size);
memory_block* mb_copy(const memory_block* src);
void mb_destroy(memory_block* block);
unsigned char* mb_copy_data(memory_block* block, const unsigned char* data, unsigned int len);
unsigned char* mb_add_copy_data(memory_block* block, const unsigned char* data, unsigned int len);
void mb_clear(memory_block* block);
unsigned int mb_get_buff_size(const memory_block* block);
unsigned int mb_get_real_buff_size(const memory_block* block);
unsigned char* mb_get_buff_head(const memory_block* block);

// mcp_msg_queue 相关函数
msg_queue* mq_create(void);
void mq_destroy(msg_queue* queue);
int mq_get_msg_size_que_used(const msg_queue* queue);
int mq_get_msg_size_que_unused(const msg_queue* queue);
memory_block* mq_get_msg_que_unuse(msg_queue* queue);
memory_block* mq_get_msg_que_used(msg_queue* queue);
int mq_submit_msg_que_unuse(msg_queue* queue, memory_block* msg);
int mq_submit_msg_que_used(msg_queue* queue, memory_block* msg);

// 辅助函数
static int resize_queue(memory_block*** queue, int* capacity, int newCapacity);

#endif // MCP_MESSAGE_QUEUE_H